import os
import pandas as pd
from pathlib import Path

def search_numbers_in_excel(directory, numbers):
    # 支持的Excel文件扩展名
    excel_extensions = ('.xlsx', '.xls', '.xlsm', '.xlsb')
    
    # 存储搜索结果，为每个编号创建独立的结果列表
    results = {number: [] for number in numbers}
    
    # 遍历目录下的所有Excel文件
    for root, _, files in os.walk(directory):
        # 跳过MACOSX目录
        if '__MACOSX' in root:
            continue
            
        for file in files:
            # 跳过临时文件和搜索结果文件
            if file.startswith('~$') or file == '搜索结果.xlsx':
                continue
                
            if file.lower().endswith(excel_extensions):
                file_path = os.path.join(root, file)
                try:
                    # 检查文件是否可访问
                    if not os.access(file_path, os.R_OK):
                        print(f"无法访问文件 {file_path}：权限不足")
                        continue
                        
                    # 读取Excel文件的所有sheet
                    excel_file = pd.ExcelFile(file_path)
                    for sheet_name in excel_file.sheet_names:
                        df = pd.read_excel(excel_file, sheet_name=sheet_name)
                        
                        # 将DataFrame转换为字符串类型进行搜索
                        df_str = df.astype(str)
                        
                        # 搜索每个编号
                        for number in numbers:
                            number_str = str(number).strip()
                            # 在DataFrame中搜索编号
                            for col_idx, col in enumerate(df_str.columns):
                                matches = df_str[df_str[col].str.contains(number_str, na=False)]
                                if not matches.empty:
                                    # 获取匹配的行索引
                                    for idx in matches.index:
                                        # 获取Excel列名（A, B, C等）
                                        excel_col = chr(65 + col_idx) if col_idx < 26 else chr(64 + col_idx // 26) + chr(65 + (col_idx % 26))
                                        results[number].append({
                                            '编号': number_str,
                                            '文件路径': file_path,
                                            '工作表': sheet_name,
                                            '列名': col,
                                            '行号': idx + 2,  # Excel行号从1开始，标题占据第1行
                                            '单元格': f'{excel_col}{idx + 2}'
                                        })
                except Exception as e:
                    print(f"处理文件 {file_path} 时出错: {str(e)}")
                    continue
    
    return results

def export_results(results, output_file):
    try:
        # 检查输出目录是否存在并具有写入权限
        output_dir = os.path.dirname(output_file)
        if not os.path.exists(output_dir):
            print(f"错误：输出目录 {output_dir} 不存在！")
            return
        if not os.access(output_dir, os.W_OK):
            print(f"错误：没有写入权限到目录 {output_dir}！")
            return
            
        # 如果文件已存在，尝试删除
        if os.path.exists(output_file):
            try:
                os.remove(output_file)
            except Exception as e:
                print(f"警告：无法删除已存在的搜索结果文件：{str(e)}")
                output_file = os.path.join(os.path.dirname(output_file), '搜索结果_新.xlsx')
                print(f"将使用新的文件名：{output_file}")
        
        # 创建一个ExcelWriter对象
        with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
            # 遍历每个编号的结果并写入不同的sheet
            for idx, (number, number_results) in enumerate(results.items(), 1):
                if number_results:  # 如果有搜索结果
                    sheet_name = f"{idx}-{number}"
                    # 如果sheet名称过长，进行截断
                    if len(sheet_name) > 31:  # Excel的sheet名称最大长度为31
                        sheet_name = f"{idx}-{number[:28]}..."
                    df_results = pd.DataFrame(number_results)
                    df_results.to_excel(writer, sheet_name=sheet_name, index=False)
            
        # 检查是否有任何结果被写入
        any_results = any(len(results[number]) > 0 for number in results)
        if any_results:
            print(f"\n搜索结果已导出到: {output_file}")
        else:
            print("\n未找到匹配的结果")
    except Exception as e:
        print(f"导出结果时出错: {str(e)}")

def main():
    # 获取用户输入的目录路径
    directory = input("请输入要搜索的文件夹路径: ")
    
    # 检查目录是否存在
    if not os.path.exists(directory):
        print("错误：指定的目录不存在！")
        return
    
    # 获取要搜索的编号列表
    print("\n请输入要搜索的编号（每行一个，输入空行结束）:")
    numbers = []
    while True:
        number = input()
        if not number:
            break
        numbers.append(number)
    
    if not numbers:
        print("错误：未输入任何编号！")
        return
    
    # 设置输出文件路径
    output_file = os.path.join(directory, '搜索结果.xlsx')
    
    print("\n开始搜索，请稍候...")
    # 执行搜索
    results = search_numbers_in_excel(directory, numbers)
    
    # 导出结果
    export_results(results, output_file)

if __name__ == "__main__":
    main()